<?php

/**
 * Abstracao [TIPO]
 * Descricao
 * @copyright (c) year, Romulo B. Bosco 
 */

//NAO PODERA SER INSTANCIADA. E UMA SUPERCLASSE
abstract class Abstracao {

    public $Cliente;
    public $Conta;
    public $Saldo;

    function __construct($Cliente, $Saldo) {
        $this->Cliente= $Cliente;
        $this->Saldo = $Saldo;
    }

    public function Depositar($Valor) {
        $this->Saldo += (float) $Valor;
        echo "<span style='color:green'><b>{$this->Conta}:</b> Deposito de {$this->Real($Valor)} efetuado com sucesso!</span><br>";
    }

    public function Sacar($Valor) {
        $this->Saldo -= (float) $Valor;
        echo "<span style='color:red'><b>{$this->Conta}:</b> Saque de {$this->Real($Valor)} efetuado com sucesso!</span><br>";
    }

    /** @param Abstracao $Destino */
    public function Transferir($Valor, $Destino) {
        //TIVER OS MESMOS VALORES OU SER DO MESMO TIPO OU AINDA DENTRO DE UMA MESMA CLASSE DO MESMO OBJETO,
        //NAO PODERA SER ACEITO.
        if ($this === $Destino):
            echo "Voce nao pode transferir valores para mesma conta!<br>";
        else:
            echo "<hr>";
            $this->Sacar($Valor);
            $Destino->Depositar($Valor);
            echo "<span style='color:blue'><b>{$this->Conta}:</b> Transferencia de {$this->Real($Valor)} efetuado com sucesso de {$this->Cliente}<br>";
            echo "para {$Destino->Cliente}";
            echo "</span>";
            echo "<hr>";
        endif;
    }

    public function Extrato() {
        echo "<hr><hr>Ola {$this->Cliente}. Seu saldo em {$this->Conta} e de {$this->Real($this->Saldo)}<hr>";
    }

    public function Real($Valor) {
        return "R$ " . number_format($Valor, '2', '.', ',');
    }
    
    //METODO ABSTRACT OBRIGA QUE QUALQUER CLASSE QUE ESTENDA ESTA, A IMPLEMENTAR ESTE METODO
    //NAO DEVE TER CORPO
    abstract public function VerSaldo();
}
